//package com.souche.sts.study;
//
//import com.study.webapp.connectionpool.ThreadPool;
//
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.concurrent.atomic.AtomicLong;
//
///**
// * @program: sts
// *
// * @description:
// *
// * @author: heqiang
// *
// * @create: 2019-09-24 15:47
// **/
//public class DefaultThreadPool<Job extends Runnable> implements ThreadPool<Job> {
//
//    //最大限制数
//    private static final int MAX_WORKER_NUMBER = 10;
//    //默认数
//    private static final int DEFAULT_WORKER_NUMBER = 5;
//    //最小数
//    private static final int MIN_WORKER_NUMBER = 1;
//    //工作列表
//    private final LinkedList<Job> jobs = new LinkedList<>();
//    //工作者列表
//    private final List<Worker> workers = Collections.synchronizedList(new ArrayList<Worker>());
//    //工作者线程的数量
//    private int workerNum = DEFAULT_WORKER_NUMBER;
//    //线程编号生成
//    private AtomicLong threadNum = new AtomicLong();
//
//    public DefaultThreadPool(){
//        initializeWorkers(DEFAULT_WORKER_NUMBER);
//    }
//
//    public DefaultThreadPool(int num){
//        workerNum = num > MAX_WORKER_NUMBER ? MAX_WORKER_NUMBER :num < MAX_WORKER_NUMBER ? MIN_WORKER_NUMBER : num;
//        initializeWorkers(workerNum);
//    }
//
//    private void initializeWorkers(int num){
//        for (int i=0;i<num;i++) {
//            Worker worker = new Worker();
//            workers.add(worker);
//            Thread thread = new Thread(worker,"ThreadPool-worker-"+threadNum.incrementAndGet());
//            thread.start();
//
//        }
//    }
//
//    class Worker implements Runnable {
//
//        private volatile boolean running = true;
//
//        @Override
//        public void run() {
//            while (running) {
//                Job job = null;
//                synchronized (jobs) {
//                    //如果空，就等待
//                    while (jobs.isEmpty()){
//                        try {
//                            jobs.wait();
//                        } catch (InterruptedException e) {
//                            //检测是否被中断
//                           Thread.currentThread().interrupted();
//                           return;
//                        }
//                    }
//                    //取出一个
//                    job = jobs.removeFirst();
//                }
//                if (job != null) {
//                    job.run();
//                }
//            }
//        }
//
//        public void shutdown () {
//            running = false;
//        }
//    }
//
//    @Override
//    public void execute(Job job) {
//        if(job != null){
//            synchronized (jobs) {
//                jobs.addLast(job);
//                jobs.notify();
//            }
//        }
//    }
//
//    @Override
//    public void shutdown() {
//        for (Worker worker : workers) {
//            worker.shutdown();
//        }
//    }
//
//    @Override
//    public void addWorker(int num) {
//
//    }
//
//    @Override
//    public void addWorkers(int num) {
//        synchronized (jobs) {
//            if (num + this.workerNum > MAX_WORKER_NUMBER) {
//                num = MAX_WORKER_NUMBER - this.workerNum;
//            }
//            initializeWorkers(num);
//            this.workerNum += num;
//        }
//    }
//
//    @Override
//    public void removeWorker(int num) {
//        synchronized (jobs) {
//            if(num > this.workerNum){
//                throw new IllegalArgumentException("beyond workNum");
//            }
//            //
//            int count = 0;
//            while (count < num) {
//                Worker worker = workers.get(count);
//                if(workers.remove(worker)){
//                    worker.shutdown();
//                    count++;
//                }
//            }
//            this.workerNum -= count;
//        }
//    }
//
//    @Override
//    public int getJobSize() {
//        return jobs.size();
//    }
//
//}
